import axios from "axios";
import { reject } from "lodash";
import { useRouter } from "vue-router";
const router = useRouter()

axios.create({
  timeout: 5000,
  timeoutErrorMessage: '请求超时，请稍后再试',
});

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  const token = localStorage.getItem('token')
  if (token) {
    // 将token添加到请求头
    config.headers['Authorization'] = `Bearer ${token}`;
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response;
}, function (error) {
  if (error.response && error.response.status === 401) {
    return refreshToken().then(newToken => {
      localStorage.setItem('token', newToken);
      error.config.headers['Authorization'] = `Bearer ${newToken}`
      return axios(error.config)
    })
  }
  if (error.response) {
    switch (error.response.status) {
      case 400:
        console.error('请求错误，可能是请求参数错误或格式不正确。');
        break;
      case 401:
        console.error('未授权，请登录。');
        // 可以在此处进行重新登录或刷新 token 的操作
        localStorage.removeItem('token');
        location.href = '/login';
        break;
      case 403:
        console.error('没有权限访问该资源。');
        break;
      case 404:
        console.error('请求的资源未找到。');
        break;
      case 500:
        console.error('服务器内部错误，请稍后重试。');
        break;
      default:
        console.error('请求失败，错误码：', error.response.status);
    }
  }
  // 对响应错误做点什么
  return Promise.reject(error);
});

function refreshToken() {
  return new Promise((resolve, reject) => {
    axios.post('/api/refreshToken', {
      refresh_token: localStorage.getItem('refresh_token')
    }).then(response => {
      // 成功获取新token
      const newToken = response.data.token;
      resolve(newToken)
    }).catch(error => {
      // 刷新token失败，清除存储的token并跳转到登录页面
      localStorage.removeItem('token')
      localStorage.removeItem('refresh_token')
      // 跳转到登录页
      router.push('/login')
      throw error;
    })
  })
}

export default axios
